home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
007
/
jovept2.arc
/
TEMP.C
< prev
next >
Wrap
Text File
|
1985-05-30
|
5KB
|
249 lines
/* temp.c */
/* JOVE/MSDOS. K. Mitchum 1/85 */
/* Modifications for personal use only. */
/* original code J. Payne LSRHS 5/83 */
/* Ken Mitchum */
/* University of Pittsburgh */
/* Decision Systems Laboratory */
/*
Jonathan Payne at Lincoln-Sudbury Regional High School 5-25-83
Much of this code was lifted from VI (ex_temp.c). These functions
deal with (put/get)ing lines in/from the tmp file. */
#define JOVETEMP
#include "jove.h"
#include "temp.h"
#include "files.h"
int DOLsave = 0; /* Do Lsave flag. If lines aren't being save
when you think they should have been, this
flag is probably not being set, or is being
cleared before lsave() was called. */
tmpinit()
{
#ifdef UNIX
tfname = mktemp(TMPFILE);
#else
tfname = "joveswap";
#endif
tline = 2;
iblock1 = oblock = iblock2 = -1;
hitin2 = ichng1 = ichng2 = 0;
ignore(close(creat(tfname, TEMPMODE)));
tmpfd = open(tfname, RWMODE);
if (tmpfd == -1) {
putstr(sprint("%s?\n", tfname));
finish(0);
}
}
#ifndef UNIX
closetmp()
{
close(tmpfd);
}
#endif
/* Get a line at `tl' in the tmp file into `buf' which should be LBSIZE
long. */
char *
getline(tl, buf)
disk_line tl;
char *buf;
{
register char *bp,
*lp;
register int nl;
lp = buf;
bp = getblock(tl, READ);
nl = nleft;
tl &= ~OFFMSK;
while (*lp++ = *bp++) {
if (--nl == 0) {
/* += INCRMT moves tl to the next block in
the tmp file. */
bp = getblock(tl += INCRMT, READ);
nl = nleft;
}
}
return buf;
}
/* Put `buf' and return the disk address */
disk_line
putline(buf)
char *buf;
{
register char *bp,
*lp;
register disk_line nl;
disk_line tl;
lp = buf;
tl = tline;
bp = getblock(tl, WRITE);
nl = nleft;
tl &= ~OFFMSK;
while (*bp = *lp++) {
if (*bp++ == '\n') {
*--bp = 0;
break;
}
if (--nl == 0) {
bp = getblock(tl += INCRMT, WRITE);
nl = nleft;
}
}
nl = tline;
tline += (((lp - buf) + BNDRY - 1) >> SHFT) & 077776;
return nl | DIRTY; /* So it will be redisplayed */
}
/* Get a block which contains at least part of the line with the address
* atl. Returns a pointer to the block and sets the global variable
* nleft (number of good characters left in the buffer)
*/
char *
getblock(atl, iof)
disk_line atl;
{
extern int read(),
write();
register int bno,
off;
if (atl == 0)
complain("Free line in list!!!");
bno = (atl >> OFFBTS) & BLKMSK;
off = (atl << SHFT) & LBTMSK;
if (bno >= NMBLKS)
error("Tmp file too large. Get help");
nleft = BUFSIZ - off;
if (bno == iblock1) {
ichng1 |= iof;
return ibuff1 + off;
}
if (bno == iblock2) {
ichng2 |= iof;
return ibuff2 + off;
}
if (bno == oblock)
return obuff + off;
if (iof == READ) {
if (hitin2 == 0) {
if (ichng2)
blkio(iblock2, ibuff2, write);
ichng2 = 0;
iblock2 = bno;
blkio(bno, ibuff2, read);
hitin2 = 1;
return (ibuff2 + off);
}
hitin2 = 0;
if (ichng1)
blkio(iblock1, ibuff1, write);
ichng1 = 0;
iblock1 = bno;
blkio(bno, ibuff1, read);
return (ibuff1 + off);
}
if (oblock >= 0)
blkio(oblock, obuff, write);
oblock = bno;
return obuff + off;
}
#ifdef VMUNIX
#define INCORB 64
char incorb[INCORB+1][BUFSIZ];
#define pagrnd(a) ((char *)(((int)a)&~(BUFSIZ-1)))
#endif
blkio(b, buf, iofcn)
short b;
char *buf;
int (*iofcn)();
{
#ifdef VMUNIX
if (b < INCORB) {
if (iofcn == read) {
bcopy(pagrnd(incorb[b+1]), buf, BUFSIZ);
return;
}
bcopy(buf, pagrnd(incorb[b+1]), BUFSIZ);
return;
}
#endif
ignore(lseek(tmpfd, (long) (unsigned) b * BUFSIZ, 0));
if ((*iofcn)(tmpfd, buf, BUFSIZ) != BUFSIZ)
error("IO error");
}
#ifdef VMUNIX
/* block copy from from to to, count bytes */
bcopy(from, to, count)
#ifdef vax
char *from, *to;
int count;
{
asm(" movc3 12(ap),*4(ap),*8(ap)");
}
#else
register char *from, *to;
register int count;
{
while ((--count) >= 0)
*to++ = *from++;
}
#endif
#endif
/*
* Save the current contents of linebuf, if it has changed.
*/
lsave()
{
char tmp[LBSIZE];
if (curbuf == 0 || !DOLsave) /* Nothing modified recently */
return;
if (!strcmp(linebuf, getline(curline->l_dline, tmp)))
return; /* They are the same. */
SavLine(curline, linebuf); /* Put linebuf on the disk */
DOLsave = 0;
}
getDOT()
{
ignore(getline(curline->l_dline, linebuf));
}
SavLine(addr, buf)
LINE *addr;
char *buf;
{
addr->l_dline = putline(buf);
}
/*----------------------------------o.s. dependent-------------------*/
/* end */